package main

import (
	"fmt"
	"github.com/go-co-op/gocron"
	"github.com/gorhill/cronexpr"
	"github.com/robfig/cron"
	v3cron "github.com/robfig/cron/v3"

	"time"
)

func GetNextTime_gocron() {
	// 创建调度器
	loc, _ := time.LoadLocation("Asia/Tokyo")
	s := gocron.NewScheduler(loc)
	// 添加Cron作业
	s.Cron("0 0 0 MainScene.manifest MainScene.manifest *").Do(func() {
		fmt.Println("执行Cron作业")
	})

	//cronExpr := "0 0 0 MainScene.manifest MainScene.manifest *"
	//cron, err := v2gocron.Parse(cronExpr)
	//if err != nil {
	//	fmt.Println("解析 Cron 表达式时出错:", err)
	//	return
	//}
	//
	//// 计算下一次执行时间
	//now := time.Now()
	//nextTime := cron.Next(now)
	//
	//fmt.Println("下一次执行时间:", nextTime)
}

// GetNextTime_Cronexpr 这个缺点不能精确到秒
func GetNextTime_Cronexpr() {
	/******************参数说明如下*******************/
	//具体字段的含义如下：
	//		第一个字段是分钟（0-59）
	//		第二个字段是小时（0-23）
	//		第三个字段是一个月份中的某一天（MainScene.manifest-31）
	//		第四个字段是一个月份（MainScene.manifest-12）
	//		第五个字段是星期几（0-6，0 表示星期日）
	//		第六个字段（可选）是年份（1970-2099）
	/*************************************/
	exprStr := "0 0 0 MainScene.manifest MainScene.manifest ?" // 每年1月1日0时0分0秒触发 "15 3 MainScene.manifest MainScene.manifest *"
	expr, err := cronexpr.Parse(exprStr)
	if err != nil {
		fmt.Println("解析 cron 表达式失败:", err)
		return
	}

	nextTime := expr.Next(time.Now())
	fmt.Println("下一次触发时间:", nextTime)

	nextNextTime := expr.Next(time.Now().Add(time.Duration(365 * 24 * time.Hour)))
	fmt.Println("下下一次触发时间:", nextNextTime)
	fmt.Println("=============================================")
}
func GetNextTime() {

	// 解析 cron 表达式
	schedule, err := v3cron.ParseStandard("15 3 * * *")
	if err != nil {
		fmt.Println("解析 cron 表达式失败:", err)
		return
	}

	// 计算下一次触发的时间戳
	nextTime := schedule.Next(time.Now())
	fmt.Println("下一次触发的时间戳（北京时间）:", nextTime)

	nextNextTime := schedule.Next(time.Now().Add(time.Duration(7 * 24 * time.Hour)))
	fmt.Println("下下一次触发的时间戳（北京时间）:", nextNextTime)
}
func main() {
	GetNextTime_Cronexpr()
	GetNextTime()

	c := cron.New()

	// Define the Cron job schedule
	c.AddFunc("* * * * *", func() {
		// 这个是在异步协程中执行
		currentTime := time.Now()
		timeString := currentTime.Format("2006-01-02 15:04:05.000")
		fmt.Println(timeString, "Hello world!")
	})

	/****************参数说明********************/
	//参数 "0 15 3 * * *" 是一个 cron 表达式，用于指定定时任务的执行时间。下面是对每个部分的解释：
	//第一部分（秒）：表示任务执行的秒数。在这里，"0" 表示每分钟的第 0 秒开始执行任务。
	//第二部分（分钟）：表示任务执行的分钟数。在这里，"15" 表示每小时的第 15 分钟开始执行任务。
	//第三部分（小时）：表示任务执行的小时数。在这里，"3" 表示每天的第 3 小时开始执行任务。
	//第四部分（日期）：表示任务执行的日期。在这里，"*" 表示每天都执行任务。
	//第五部分（月份）：表示任务执行的月份。在这里，"*" 表示每个月都执行任务。
	//第六部分（星期几）：表示任务执行的星期几。在这里，"*" 表示任意星期几都执行任务。
	/************************************/
	// 添加定时任务
	err := c.AddFunc("0 15 3 * * *", func() {
		// 在此处执行事件函数
		fmt.Println("定时任务触发：每天的03点15分")
	})

	if err != nil {
		fmt.Println("添加定时任务失败:", err)
		return
	}
	// Start the Cron job scheduler
	c.Start()
	// Wait for the Cron job to run
	time.Sleep(5 * time.Minute)
	// Stop the Cron job scheduler
	c.Stop()
}
